perm filename LOSS.1[AID,LSP]5 blob sn#688796 filedate 1982-11-29 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	(LET ((FASLOAD ())) (FASLOAD UMATCH))
C00033 ENDMK
C⊗;
(LET ((FASLOAD ())) (FASLOAD UMATCH))
(load "umatch.126")
(car %/#p)
(car %/#d)
(step %umatch)
(trace %%umatch)

(%umatch '((all ?x (some ?y) (foo ?x ?y)))
	 '((all ?x (some ?y) (foo ?y ?x))))

(%umatch '((all ?x (some ?y) (foo ?x ?y)))
	 '((all ?x (some ?y) (foo ?X ?Y))))

(%umatch '(A ?X ?y) '(A ?y ?x))
(%umatch '(?X ?y) '(?y ?x))
(%umatch '(A *X B) '(A ?X ?Y B))

(%UMATCH '(A ?X B) '(A (?X) B))
(%UMATCH '(A ?X B) '(A ?X B))
(%umatch '(?q ?x) '(can-fly tweety))

(%umatch '((all ?x bird)(can-fly ?x))
	 '((ALL ?Y ?CLASS) (?Q ?Y)) )

(%umatch '((?a ?b ?c) ?d) '((all ?x ?foo) 4))

(let (fasload)(fasload umatch))
(%umatch-pair '((?a1 ?b1 ?c1) ?d1) '((?x1 ?y1 ?z1) ?w1))
(%umatch      '((?a1 ?b1 ?c1) ?d1) '((?x1 ?y1 ?z1) ?w1))
(%umatch '(($ch ?x) ?y)'(1 2))
(%umatch-PAIR '(= ($ch 1) 2)'(= ($ch ?x) ?y))
(%umatch-PAIR '(a  1 2)'(a ($ch ?x) ?y))
(%umatch-PAIR '(($CH 1) 2)'(($CH ?x) 2))

UMATCH-ALIST
(TRACE %%UMATCH)
(UNTRACE)
(MAKUNBOUND '?B)
(STEP CLAUSE-*-VARIABLE)
(%umatch '(?B B) '(*A B))
?B
*A
(%%special-formp '(-special-form- . *))

(progn (break t t) (print 'foo))

;;; Macros for Unification
(DECLARE (SETSYNTAX 35. 2 35.))
(DECLARE (SPECIAL %/#CONTINUE %/#CONTINUE-STACK %/#RETAIN %/#CE %/#ALIST COMPILE-MACROS UMATCH-ALIST))
(declare (special %/#full-predicate %/#OCCURS))
(setq %/#full-predicate ())
(declare (fasload struct fas dsk (mac lsp)))

;;; %/#CONTINUE is T if this is a rematch. %/#RETAIN says
;;; whether or not to save information for a rematch
;;; %/#CONTINUE-STACK saves * information for the rematch
(SETQ %/#CONTINUE NIL %/#CONTINUE-STACK NIL %/#RETAIN NIL COMPILE-MACROS NIL %/#OCCURS () UMATCH-ALIST ())

(DEFUN %%OCCURS (X L)
       (COND ((MEMQ L (CDR (ASSQ X %/#OCCURS))) T)
	     ((EQ X L) ())
	     (T (%%OCCURS1 X L L))))

(DEFUN %%OCCURS1 (X L TOP)
       (COND ((NULL L) ())
	     ((EQ X L) (LET ((ENTRY (ASSQ X %/#OCCURS)))
			    (COND (ENTRY
				   (NCONC ENTRY `(,TOP)))
				  (T (PUSH `(,X . (,TOP))
					   %/#OCCURS))))
		       T)
	     ((ATOM L) ())
	     (T (OR (%%OCCURS1 X (CAR L) TOP)
		    (%%OCCURS1 X (CDR L) TOP)))))

(MACRODEF MAKE-SPECIAL-FORM (X) (CONS '-SPECIAL-FORM- X))

(MACRODEF SPECIAL-FORM (X)
 (LET QQQ ← X DO
	  (COND ((%%SPECIAL-FORMP QQQ)
		 '-SPECIAL-FORM-)
		(T QQQ))) )

(MACRODEF %%CHAR1 (ATOM) 
       ;; returns the 1st character of an atom.
       (COND ((EQ (TYPEP ATOM) 'SYMBOL) (GETCHAR ATOM 1.))))

(MACRODEF REAL-ATOM (%/#X)(AND %/#X (ATOM %/#X))) 



(DECLARE (SPECIAL -SEEN-))

(DEFUN %%CHECK (L)
  ((LAMBDA(-SEEN-)
    (%%CHECK1 L)) ())) 

(DEFUN %%CHECK1 (L)
 (COND ((MEMQ L -SEEN-) L)
       ((ATOM L) L)
       ((HUNKP L) (PUSH L -SEEN-) L)
       ((EQ (CAR L) '-SPECIAL-FORM-)
	(CDR L))
       ((MEMQ (CAR L) '($R RESTRICT ⊗R $IR IRESTRICT ⊗IR $CH $CHOOSE))
	(CADR L))
       (T 
	(PUSH l -SEEN-)
	(CONS (%%CHECK1 (CAR L) )
	      (%%CHECK1 (CDR L))))))  

(MACRODEF PROCESSED-SPECIAL-FORMP (X)
	  (LET ((Q X))
	       (COND ((ATOM Q) ())
		     (T (EQ (CAR Q) '-SPECIAL-FORM-)))))

(MACRODEF ALL-TRUE (FUN %/#L)
 (APPLY 'AND 
	(MAPCAR 
	 (FUNCTION  
	  (LAMBDA (%Q%)
		   (COND ((OR (RESTRICTP %Q%)
			      (%%SPECIAL-FORMP %Q%)
			      (FUNCALL FUN %Q%)) 
			      T))))
		     %/#L)))

(MACRODEF RESTRICTP (%/#X) (AND (NOT (ATOM %/#X))
			     (MEMQ (CAR %/#X) '($R RESTRICT ⊗R $IR IRESTRICT ⊗IR))))


(MACRODEF EXCHANGE (X Y)
  ((LAMBDA (Q)
	   (SETQ X Y)
	   (SETQ Y Q))
   X))


(DEFUN %%SPECIAL-FORMP (X)
       (COND (%/#FULL-PREDICATE ())
	     ((ATOM X)
	      (OR (EQ X '-SPECIAL-FORM-)
		  (AND (NOT (EQ X '=))
		       (MEMQ (%%CHAR1 X) '(? * =)))))
	     (T (OR (EQ (CAR X) '-SPECIAL-FORM-)
		    (RESTRICTP X))))  )

(MACRODEF CLAUSE-?-RESTRICTIONS (P D CP CD ALIST)
	  (COND
	   ((EQ (CADAR P) '?)
	    ;;; normal case of ($r ? ...)
	    (COND ((%%SPECIAL-FORMP (CAR D))
		   (SETQ P (CONS (CONS '-SPECIAL-FORM- (CAR P)) (CDR P)))
		   (EXCHANGE P D)(EXCHANGE CP CD))
		  (T 
		   (SETQ P (CDR P) D (CDR D))))
	    (GO UMATCH)) 
	   ((EQ (%%CHAR1 (CADAR P)) '?)
	    ;;; case of ($r ?foo ...)
	    ((LAMBDA (%T%) 
	      (COND (%T% (SETQ P (CONS (SPECIAL-FORM (CDR %T%)) (CDR P)))
			 (GO UMATCH))
		     (T 
		      (LET ((SPECP ())(RESTRP ()))
		      (COND (
		      (*CATCH '%/#DECISION-POINT
		       (COND 
			((%%OCCURS (CADAR P) (COND ((RESTRICTP (CAR D))
						    (CADAR D))
						   (T (CAR D))))
			 ())
			((%%SPECIAL-FORMP (CAR D))
			 (LET ((G (GENSYM))
			       (ALIST ALIST))
			      (COND ((RESTRICTP (CAR D))
				     (COND ((EQ (%%CHAR1 (CADAR D))
						'?)
					    (SETQ SPECP T RESTRP T)
					    (PUSH (CONS (CADAR D) G) ALIST))))
				    ((EQ (%%CHAR1 (CAR D)) '?)
				     (SETQ SPECP T)
				     (PUSH (CONS (CAR D) G) ALIST)))
			  (COND ((PROCESSED-SPECIAL-FORMP (CAR D))
				 (%%UMATCH (CDR D) (CDR P) CD CP
				    (CONS (CONS (CAR P)
						G) ALIST) NOBIND))
				(T (%%UMATCH D P CD CP 
					     (CONS (CONS (CAR P)
							 G) ALIST) NOBIND)))))
			(T (%%UMATCH (CDR P)(CDR D) CP CD
				     (CONS (CONS (CADAR P)
						 (CAR D))
					   ALIST) NOBIND)))  
		       )
		      (CASEQ NOBIND
			     (PAIR (PUSH `(,(CADAR P) . ,(%%CHECK (CAR D)))
					 UMATCH-ALIST)
				   (COND (SPECP
					  (COND (RESTRP
						 (PUSH `(,(CADAR D) . ,(%%CHECK (CADAR P)))
						       UMATCH-ALIST))
						(T (PUSH `(,(CAR D) . ,(%%CHECK (CADAR P)))
							 UMATCH-ALIST))))))
			     (() (SET (CADAR P) (%%CHECK (CAR D)))
				 (COND (SPECP
					(COND (RESTRP
					       (SET (CADAR D) (%%CHECK (CADAR P))))
					      (T (SET (CAR D) (%%CHECK (CADAR P))))))))
			     (T ()))
		      (*THROW '%/#DECISION-POINT T ))
			    (T (*THROW '%/#DECISION-POINT ())))))))
	      (ASSQ (CADAR P) ALIST)))))

(MACRODEF CLAUSE-*-RESTRICTIONS (P D CP CD ALIST)
	  (COND ((EQ (CADAR P) '*)
		 ((LAMBDA (L)
			  (COND (%/#CONTINUE
				 ;(OR %/#CONTINUE-STACK (*THROW '%/#DECISION-POINT NIL ))
				 ;;; initialize for continuation
				 (SETQ L (PROG2 NIL (CAR %/#CONTINUE-STACK)
						(SETQ %/#CONTINUE-STACK 
						      (CDR %/#CONTINUE-STACK))))
				 (SETQ D (DO ((L L (CDR L))
					      (D D (CDR D)))
					     ((NULL L) D)))
				 (COND ((NULL D)
					(SETQ P (CDR P))
					(GO UMATCH))))
				(T (SETQ L NIL)))
			  ;;; try all possibilities
			  (DO ((L L (NCONC L (NCONS (CAR D))))
			       (SP (%%SPECIAL-FORMP (CAR D)))
			       (OD D OD)
			       (OP P OP)
			       (D D (CDR D))
			       (E (CONS NIL D) (CDR E)))
			      ((NULL E) (*THROW '%/#DECISION-POINT NIL ))
			      (COND ((APPLY 'AND
					    (MAPCAR 
					     (FUNCTION
					      (LAMBDA (Q)
						      (COND
						       ((FUNCALL Q L)
							T))))
					     (CDDAR P))) 
				     (COND 
				      ((*CATCH '%/#DECISION-POINT
					       (COND
						((AND L
						      (%%SPECIAL-FORMP (CAR OD)))
						 (%%UMATCH
						  OD OP CD CP ALIST NOBIND))
						(T 
						 (%%UMATCH (CDR P) D CP CD
							   ALIST NOBIND))) 
					       )
				       (AND SP
					    (*CATCH '%/#DECISION-POINT
					       (%%UMATCH L
							 (NCONS (MAKE-SPECIAL-FORM (CAR P)))
							 CP CD
							 (CONS (CONS (CAR P) L) ALIST) NOBIND)))
				       (AND %/#RETAIN 
					    (SETQ %/#CONTINUE-STACK
						  (CONS L %/#CONTINUE-STACK)))
				       (*THROW '%/#DECISION-POINT T )))))))
		  NIL))
		((EQ (%%CHAR1 (CADAR  P)) '*)
		 ((LAMBDA (%T%) 
			   (COND (%T% (COND((APPLY 'AND
						   (MAPCAR
						    (FUNCTION
						     (LAMBDA (Q)
							     (COND 
							      ((FUNCALL Q (CDR %T%))
									T))))
						     (CDDAR P)))
						   (SETQ P (APPEND 
							    (SPECIAL-FORM (CDR %T%)) (CDR P)))
							 (GO UMATCH)) 
						   (T (*THROW '%/#DECISION-POINT NIL ))))
				       (T ((LAMBDA(L)
					    (COND (%/#CONTINUE
						   (SETQ L (SYMEVAL (CAR P)))
						   (SETQ D (DO ((L L (CDR L))
								(D D (CDR D)))
							       ((NULL L) D)))
						   (COND ((NULL D)
							  (SETQ P (CDR P))
							  (GO UMATCH))))
						  (T (SETQ L NIL)))
					    (DO ((L L (NCONC L (NCONS (CAR D))))
						 (SP (%%SPECIAL-FORMP (CAR D)))
						 (OP P OP)
						 (OD D OD)
						 (D D (CDR D))
						 (E (CONS NIL D) (CDR E)))
						((NULL E) (*THROW '%/#DECISION-POINT NIL ))
						(COND
						 ((APPLY
						   'AND
						   (MAPCAR
						    (FUNCTION
						     (LAMBDA (Q)
							     (COND((FUNCALL Q L)
								   T))))
						    (CDDAR P)))
						  (COND 
						   ((*CATCH '%/#DECISION-POINT
							    (COND 
							     ((AND L
								   (%%SPECIAL-FORMP (CAR OD)))
							      (%%UMATCH OD OP CD CP
									(CONS
									 (CONS (CADAR P) 
									       (CONS 
										(CONS 
										 '-SPECIAL-FORM- 
										 (CAR OD))
										(CDR L)))
									 ALIST) NOBIND))  
							     (T (%%UMATCH 
								 (CDR P) D CP CD
								 (CONS
								  (CONS (CADAR P) 
									L)
								  ALIST) NOBIND))  )
							    )
						    (AND SP
							 (*CATCH '%/#DECISION-POINT
							    (%%UMATCH L
								      (NCONS (MAKE-SPECIAL-FORM (CAR P)))
								      CP CD
								      (CONS (CONS (CAR P) L) ALIST) NOBIND)))
						    (CASEQ NOBIND
							   (PAIR (PUSH `(,(CADAR P) . ,(%%CHECK L))
								UMATCH-ALIST))
							   (() (SET (CADAR P) (%%CHECK L)))
							   (T ()))
						    (*THROW '%/#DECISION-POINT T )))))))   
					   NIL))))
				 (ASSQ (CADAR P) ALIST)))))  
(MACRODEF CLAUSE-*-IRESTRICTIONS (P D CP CD ALIST)
	  (COND ((EQ (CADAR P) '*)
		 ((LAMBDA (L)
			  (COND (%/#CONTINUE
				 ;(OR %/#CONTINUE-STACK (*THROW '%/#DECISION-POINT NIL ))
				 ;;; initialize for continuation
				 (SETQ L (PROG2 NIL (CAR %/#CONTINUE-STACK)
						(SETQ %/#CONTINUE-STACK 
						      (CDR %/#CONTINUE-STACK))))
				 (SETQ D (DO ((L L (CDR L))
					      (D D (CDR D)))
					     ((NULL L) D)))
				 (COND ((NULL D)
					(SETQ P (CDR P))
					(GO UMATCH))))
				(T (SETQ L NIL)))
			  ;;; try all possibilities
			  (DO ((L L (NCONC L (NCONS (CAR D))))
			       (F (CAR D)(CAR D))
			       (SP (%%SPECIAL-FORMP (CAR D)))
			       (D D (CDR D))
			       (E (CONS NIL D) (CDR E)))
			      ((NULL E) (*THROW '%/#DECISION-POINT NIL ))
			      (COND ((APPLY 'AND
					    (MAPCAR 
					     (FUNCTION
					      (LAMBDA (Q)
						      (COND
						       ((OR (NULL L)
							    (RESTRICTP F)
							    (%%SPECIAL-FORMP F)
							    (FUNCALL Q F))
							T))))
					     (CDDAR P))) 
				     (COND 
				      ((*CATCH '%/#DECISION-POINT
					       (COND ((AND L
							   (%%SPECIAL-FORMP (CAR D)))
						      (%%UMATCH D (CDR P) CD CP ALIST NOBIND))
						     (T (%%UMATCH (CDR P) D CP CD
								  ALIST NOBIND)))
					       )
				       (AND SP
					    (*CATCH '%/#DECISION-POINT
					       (%%UMATCH L
							 (NCONS (MAKE-SPECIAL-FORM (CAR P)))
							 CP CD
							 (CONS (CONS (CAR P) L) ALIST) NOBIND)))
				       (AND %/#RETAIN (SETQ %/#CONTINUE-STACK
							    (CONS L %/#CONTINUE-STACK)))
				       (*THROW '%/#DECISION-POINT T )))))))
		  NIL))
		((EQ (%%CHAR1 (CADAR  P)) '*)
		 ((LAMBDA (%T%) 
			   (COND 
			    (%T% 
			     (COND
			      ((APPLY 
				'AND
				(MAPCAR
				 (FUNCTION
				  (LAMBDA (Q)
					  (COND ((OR (RESTRICTP %T%)
								(ALL-TRUE Q %T%))
								T))))
					  (CDDAR P)))
				 (COND ((*CATCH '%/#DECISION-POINT
						(%%UMATCH
						 (CAR P)(CAR D) () () ALIST NOBIND)
						)
					(SETQ P (APPEND (SPECIAL-FORM (CDR %T%)) (CDR P)))
					      (GO UMATCH)) 
					(T (*THROW '%/#DECISION-POINT () 
						   ))))  
				 (T (*THROW '%/#DECISION-POINT NIL ))))
			       (T ((LAMBDA(L)
				    (COND (%/#CONTINUE
					   (SETQ L (SYMEVAL (CAR P)))
					   (SETQ D (DO ((L L (CDR L))
							(D D (CDR D)))
						       ((NULL L) D)))
					   (COND ((NULL D)
						  (SETQ P (CDR P))
						  (GO UMATCH))))
					  (T (SETQ L NIL)))
				    (DO ((L L (NCONC L (NCONS (CAR D))))
					 (F (CAR D)(CAR D))
					 (OD D OD)
					 (SP (%%SPECIAL-FORMP (CAR D)))
					 (OP P OP)
					 (D D (CDR D))
					 (E (CONS NIL D) (CDR E)))
					((NULL E) (*THROW '%/#DECISION-POINT NIL ))
					(COND
					 ((APPLY
					   'AND
					   (MAPCAR
					    (FUNCTION
					     (LAMBDA (Q)
						     (COND ((OR (NULL L)
								(RESTRICTP F)
								(%%SPECIAL-FORMP F)
								(FUNCALL Q F))
							    T))))
					    (CDDAR P)))
					  (COND 
					   ((*CATCH '%/#DECISION-POINT
						    (COND ((AND L
								(%%SPECIAL-FORMP (CAR OD)))
							   (%%UMATCH OD OP CD CP
								     (CONS
								      (CONS (CADAR P)
									    (CONS (CONS 
										   '-SPECIAL-FORM- 
										   (CAR OD)) (CDR L)))
								      ALIST) NOBIND))  
							  (T 
							   (%%UMATCH (CDR P) D CP CD
								     (CONS
								      (CONS (CADAR P) L)
								      ALIST) NOBIND)))
						    )
					    (AND SP
					    (*CATCH '%/#DECISION-POINT
						    (%%UMATCH L
							      (NCONS (MAKE-SPECIAL-FORM (CAR P)))
							      CP CD
							      (CONS (CONS (CAR P) L) ALIST) NOBIND)))
					    (CASEQ NOBIND
						   (PAIR (PUSH `(,(CADAR P) . ,(%%CHECK L))
							       UMATCH-ALIST))
						   (() (SET (CADAR P) (%%CHECK L)))
						   (T ()))
					    (*THROW '%/#DECISION-POINT T )))))))
				   NIL))))
			     (ASSQ (CADAR P) ALIST)) ))) 
		  
(MACRODEF CLAUSE-?-VARIABLE (P D CP CD ALIST)
 ((LAMBDA (%T%) 
   (COND (%T% (SETQ P (CONS (SPECIAL-FORM (CDR %T%)) (CDR P)))
		    (GO UMATCH))
	  (T 
	   (LET ((SPECP ())
		 (RESTRP ()))
	   (COND 
	    ((*CATCH '%/#DECISION-POINT
	      (COND ((%%OCCURS (CAR P) (COND ((RESTRICTP (CAR D))
						(CADAR D))
					       (T (CAR D))))
		     ())
		    ((%%SPECIAL-FORMP (CAR D))
		     (LET ((G (GENSYM))
			   (ALIST ALIST))
			  (COND ((RESTRICTP (CAR D))
				 (COND ((EQ (%%CHAR1 (CADAR D))
					    '?)
					(SETQ SPECP T RESTRP T)
					(PUSH (CONS (CADAR D) G) ALIST))))
				((EQ (%%CHAR1 (CAR D)) '?)
				 (SETQ SPECP T)
				 (PUSH (CONS (CAR D) G) ALIST)))
			  (COND ((PROCESSED-SPECIAL-FORMP (CAR D))
				 (%%UMATCH (CDR D) (CDR P) CD CP
				    (CONS (CONS (CAR P)
						G) ALIST) NOBIND))
				(T (%%UMATCH D P CD CP 
					     (CONS (CONS (CAR P)
							 G) ALIST) NOBIND)))))
		    (T 
		     (%%UMATCH (CDR P)(CDR D) CP CD
			       (CONS (CONS (CAR P)(CAR D))ALIST) NOBIND))) 
	      )
	     (CASEQ NOBIND
		    (PAIR (PUSH `(,(CAR P) . ,(%%CHECK (CAR D)))
				UMATCH-ALIST)
			  (COND (SPECP
				 (COND (RESTRP
					(PUSH `(,(CADAR D) . ,(%%CHECK (CAR P)))
					      UMATCH-ALIST))
				       (T (PUSH `(,(CAR D) . ,(%%CHECK (CAR P)))
					       UMATCH-ALIST))))))
		    (() (SET (CAR P) (%%CHECK (CAR D)))
			(COND (SPECP
			       (COND (RESTRP
				      (SET (CADAR D) (%%CHECK (CAR P))))
				     (T (SET (CAR D) (%%CHECK (CAR P))))))))
		    (T ()))
	     (*THROW '%/#DECISION-POINT T ))  
	    (T (*THROW '%/#DECISION-POINT () )))))))   
   (ASSQ (CAR P) ALIST)))
  
(MACRODEF CLAUSE-* (P D CP CD ALIST)
 ((LAMBDA (L)
	  (COND (%/#CONTINUE
		 ;(OR %/#CONTINUE-STACK (*THROW '%/#DECISION-POINT NIL ))
		 ;;; initialize for continuation
		 (SETQ L (PROG2 NIL (CAR %/#CONTINUE-STACK)
				(SETQ %/#CONTINUE-STACK 
				      (CDR %/#CONTINUE-STACK))))
		 (SETQ D (DO ((L L (CDR L))
			      (D D (CDR D)))
			     ((NULL L) D)))
		 (COND ((NULL D)
			(SETQ P (CDR P))
			(GO UMATCH))))
		(T (SETQ L NIL)))
	  ;;; try all possibilities
	  (DO ((L L (NCONC L (NCONS (CAR D))))
	       (D D (CDR D))
	       (SP (%%SPECIAL-FORMP (CAR D)))
	       (E (CONS NIL D) (CDR E)))
	      ((NULL E) (*THROW '%/#DECISION-POINT NIL ))
	      (COND 
	       ((*CATCH '%/#DECISION-POINT
			(COND
			 ((AND L
			       (%%SPECIAL-FORMP (CAR D)))
			  (%%UMATCH D (CDR P) CP CD ALIST NOBIND))
			 (T (%%UMATCH (CDR P) D CP CD ALIST NOBIND) ))
			)
		(AND SP
		     (*CATCH '%/#DECISION-POINT
			(%%UMATCH L
				  (NCONS (MAKE-SPECIAL-FORM (CAR P)))
				  CP CD
				  (CONS (CONS (CAR P) L) ALIST) NOBIND)))
		(AND %/#RETAIN (SETQ %/#CONTINUE-STACK
				     (CONS L %/#CONTINUE-STACK)))
		(*THROW '%/#DECISION-POINT T )))))
  NIL))

(MACRODEF CLAUSE-*-VARIABLE (P D CP CD ALIST)
  ((LAMBDA (%T%) 
   (COND (%T% (SETQ P (APPEND (SPECIAL-FORM (CDR %T%)) (CDR P)))
		    (GO UMATCH))
	  (T ((LAMBDA(L)
	       (COND (%/#CONTINUE
		      (SETQ L (SYMEVAL (CAR P)))
		      (SETQ D (DO ((L L (CDR L))
				   (D D (CDR D)))
				  ((NULL L) D)))
		      (COND ((NULL D)
			     (SETQ P (CDR P))
			     (GO UMATCH))))
		     (T (SETQ L NIL)))
	       (DO ((L L (NCONC L (NCONS (CAR D))))
		    (D D (CDR D))
		    (SP (%%SPECIAL-FORMP (CAR D)))
		    (E (CONS NIL D) (CDR E)))
		   ((NULL E) (*THROW '%/#DECISION-POINT NIL ))
		   (COND 
		    ((*CATCH '%/#DECISION-POINT
			     (%%UMATCH (CDR P) D CP CD
				       (CONS (CONS (CAR P) L)
					     ALIST) NOBIND)
		      )
		     (AND SP
			  (*CATCH '%/#DECISION-POINT
				  (%%UMATCH L
					    (NCONS (MAKE-SPECIAL-FORM (CAR P)))
					    CP CD
					    (CONS (CONS (CAR P) L) ALIST) NOBIND)))
		     (CASEQ NOBIND
			    (PAIR (PUSH `(,(CAR P) . ,(%%CHECK L))
					UMATCH-ALIST))
			    (() (SET (CAR P) (%%CHECK L)))
			    (T ()))
		     (*THROW '%/#DECISION-POINT T )))))
	      NIL))))
   (ASSQ (CAR P) ALIST)) )     
  
(MACRODEF CLAUSE-=?-VARIABLE (P D CP CD ALIST)
  ((LAMBDA (%T%) 
	   (COND ((EQ (CAR %T%) '?)
		  ((LAMBDA (VAR)
			   ((LAMBDA (VAL)
				    (COND (VAL (SETQ P (CONS (CDR VAL) (CDR P))))
					  (T
					   (SETQ P 
						 (CONS (SYMEVAL VAR) (CDR P))))) 
				    (GO UMATCH))
			    (ASSQ VAR %/#ALIST)))
		   (IMPLODE %T%)))
		  (T 
		   ((LAMBDA (VAR)
			    ((LAMBDA (VAL)
				     (COND (VAL (SETQ P (APPEND (CDR VAL) (CDR P))))
					   (T
					    (SETQ P 
						  (APPEND (SYMEVAL VAR) (CDR P))))) 
				     (GO UMATCH))
			     (ASSQ VAR %/#ALIST)))
		    (IMPLODE %T%)))))
		  (CDR (EXPLODE (CAR P)))))